import java.util.ArrayList;
import java.util.Hashtable;

public class LuoManFuSiJi extends Method{

	private float k = 0;		// 从表中查出的k 值
	private final Hashtable<String,Float> K = new Hashtable<String,Float>();	// 表
	
	public LuoManFuSiJi(ArrayList<Float> data,int format) {
		this(data, 0.05f,format);
	}

	public LuoManFuSiJi(ArrayList<Float> data,float alpha, int format) {
		super(data, format);
		this.name = "罗曼诺夫斯基准则";
		this.initK();
		this.k = getK(data.size(),alpha);
	}
	
	@Override
	protected boolean hasGrossError(){
		ArrayList<Float> tmpData = new ArrayList<Float>();
		for(int i=0;i<data.size();i++){
			tmpData.addAll(data);
			tmpData.remove(i);
			float sigma = calSigma(tmpData);
			float avarage = calAvarage(tmpData);
			if(Math.abs(data.get(i)-avarage) > k*sigma){
				blackList.add(data.get(i));
				return true;
			}
		}
		return false;
	}
	
	/**
	 *	查表已取得k 值 
	 */
	private float getK(int n,float alpha){
		if(n<4)	n=4;
		if(n>30)	n=30;
		return K.get(n+"&"+alpha);
	}
	
	/**
	 * 初始化表
	 */
	private void initK(){
		K.put("4&0.05", 4.97f);		K.put("4&0.01", 11.46f);
		K.put("5&0.05", 3.56f);		K.put("5&0.01", 6.53f);		
		K.put("6&0.05", 3.04f);		K.put("6&0.01", 5.04f);
		K.put("7&0.05", 2.78f);		K.put("7&0.01", 4.36f);
		K.put("8&0.05", 2.62f);		K.put("8&0.01", 3.96f);
		K.put("9&0.05", 2.51f);		K.put("9&0.01", 3.71f);
		K.put("10&0.05", 2.43f);		K.put("10&0.01", 3.54f);
		K.put("11&0.05", 2.37f);		K.put("11&0.01", 3.41f);
		K.put("12&0.05", 2.33f);		K.put("12&0.01", 3.31f);
		K.put("13&0.05", 2.29f);		K.put("13&0.01", 3.23f);
		K.put("14&0.05", 2.26f);		K.put("14&0.01", 3.17f);
		K.put("15&0.05", 2.24f);		K.put("15&0.01", 3.12f);
		K.put("16&0.05", 2.22f);		K.put("16&0.01", 3.08f);
		K.put("17&0.05", 2.20f);		K.put("17&0.01", 3.04f);
		K.put("18&0.05", 2.18f);		K.put("18&0.01", 3.01f);
		K.put("19&0.05", 2.17f);		K.put("19&0.01", 3.00f);
		K.put("20&0.05", 2.16f);		K.put("20&0.01", 2.95f);
		K.put("21&0.05", 2.15f);		K.put("21&0.01", 2.93f);
		K.put("22&0.05", 2.14f);		K.put("22&0.01", 2.91f);
		K.put("23&0.05", 2.13f);		K.put("23&0.01", 2.90f);
		K.put("24&0.05", 2.12f);		K.put("24&0.01", 2.88f);
		K.put("25&0.05", 2.11f);		K.put("25&0.01", 2.86f);
		K.put("26&0.05", 2.10f);		K.put("26&0.01", 2.85f);
		K.put("27&0.05", 2.10f);		K.put("27&0.01", 2.84f);
		K.put("28&0.05", 2.09f);		K.put("28&0.01", 2.83f);
		K.put("29&0.05", 2.09f);		K.put("29&0.01", 2.82f);
		K.put("30&0.05", 2.08f);		K.put("30&0.01", 2.81f);
	}	
}